﻿#pragma warning(disable: 4996)
#pragma warning(disable: 6031)

/*
题目内容：
一个多项式可以表达为x的各次幂与系数乘积的和，比如：
2x6+3x5+12x3+6x+20
现在，你的程序要读入两个多项式，然后输出这两个多项式的和，也就是把对应的幂上的系数相加然后输出。
程序要处理的幂最大为100。

输入格式:
总共要输入两个多项式，每个多项式的输入格式如下：
每行输入两个数字，第一个表示幂次，第二个表示该幂次的系数，所有的系数都是整数。第一行一定是最高幂，最后一行一定是0次幂。
注意第一行和最后一行之间不一定按照幂次降低顺序排列；如果某个幂次的系数为0，就不出现在输入数据中了；0次幂的系数为0时还是会出现在输入数据中。

输出格式：
从最高幂开始依次降到0幂，如：
2x6+3x5+12x3-6x+20
注意其中的x是小写字母x，而且所有的符号之间都没有空格，如果某个幂的系数为0则不需要有那项。

输入样例：
6 2
5 3
3 12
1 6
0 20
6 2
5 3
2 12
1 6
0 20

输出样例：
4x6+6x5+12x3+12x2+12x+40
*/

#include <stdio.h>

#define MAXN 200

struct Polynomial {
	int f[MAXN];
};

void polynomial_read(struct Polynomial* p) {
	int a, n;
	for (int i = 0; i < MAXN; ++i)
		p->f[i] = 0;
	do {
		scanf("%d %d", &n, &a);
		p->f[n] += a;
	} while (n);
}

struct Polynomial* polynomial_add(struct Polynomial* a, struct Polynomial* b, struct Polynomial* c)
{
	for (int i = 0; i < MAXN; ++i)
		c->f[i] = a->f[i] + b->f[i];
	return c;
}

void dump(struct Polynomial* a)
{
	int n = 0;
	int i = 0;
	for (i = MAXN - 1; i >= 1; --i) {
		if (a->f[i] != 0) {
			if (n > 0 && a->f[i] > 0) {
				printf("+");
				if (a->f[i] > 1)
					printf("%d", a->f[i]);
			}
			else
				printf("%d", a->f[i]);
			printf("x");
			if (i > 1)
				printf("%d", i);
			n++;
		}
	}
	i = 0;
	if (a->f[i] != 0 || n == 0) {
		if (n > 0 && a->f[i] > 0)
			printf("+%d", a->f[i]);
		else
			printf("%d", a->f[i]);
	}
	printf("\n");
}

void solve() {
	struct Polynomial a = { 0 }, b = { 0 }, c = { 0 };
	polynomial_read(&a);
	polynomial_read(&b);
	polynomial_add(&a, &b, &c);
	dump(&c);
}

int main()
{
	freopen("D:/Develop/GitRepos/MOOC/浙江大学/数据结构/201906/DataStructure/M2019秋C入门和进阶练习集/oj7_01.txt", "r", stdin);
	solve();
	return 0;
}